package com.qf.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * projectName:temp_shop
 * author:luo
 * time:2023/3/14 22:53
 * 自定义确认机制实现类
 * 1接收交换机的确认信息
 * 2接收队列的确认信息
 *
 * @Configuration:功能是一样的，表示spring-context.xml
 * @Component：表示new一个对象
 */
@Configuration//当前类在SpringIOC容器中
public class RabbitConfirmConfig implements RabbitTemplate.ConfirmCallback//要求在RabbitTemplate的内部
        , RabbitTemplate.ReturnCallback {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生命周期 创建对象--构造器--依赖注入--初始化
     * 初始化 <bean id class init-method=init destory=..
     */
//    @Bean(initMethod = "")//初始化
//    public void adc() {
//        rabbitTemplate.setConfirmCallback(this);
//        rabbitTemplate.setReturnCallback(this);
//    }
    //创建对象的时候执行构造器
//    public RabbitConfirmConfig() {
//        rabbitTemplate.setConfirmCallback(this);
//        rabbitTemplate.setReturnCallback(this);
//    }
    /**
     * 初始化方法
     * @throws Exception
     */
    @PostConstruct
    public void dddd() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    /**
     * 初始化方法
     * @throws Exception
     */
//    @Override
//    public void afterPropertiesSet() throws Exception {
//        rabbitTemplate.setConfirmCallback(this);
//        rabbitTemplate.setReturnCallback(this);
//    }

    /**
     * 交换机确认的方法
     *
     * @param correlationData
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            //交换机成功确认
            System.out.println("交换机成功确认");
        } else {
            System.out.println("交换机失败确认：失败的原因是" + cause);
            //重新发送消息
            //计数：计数达到3次，还是失败了
            //打印日志 时间交换机 队列
            //发送短信或邮箱通知：程序员赶紧修
        }
    }

    /**
     * 队列确认的方法
     *
     * @param message
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("队列失败确认");
        System.out.println("队列失败的code："+replyCode);
        System.out.println("队列失败原因："+replyText);
    }


}
